home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / C / Applications / Moscow ML 1.42 / src / mosmllib / Random.sml < prev    next >
Encoding:
Text File  |  1997-08-18  |  1.3 KB  |  44 lines  |  [TEXT/R*ch]

  1. (* Random -- Moscow ML library 1995-04-23 *)
  2.  
  3. type generator = {seedref : real ref}
  4.  
  5. (* Generating random numbers.  Paulson, page 96 *)
  6.  
  7. val a = 16807.0 
  8. val m = 2147483647.0 
  9. fun nextrand seed = 
  10.     let val t = a*seed 
  11.     in t - m * real(floor(t/m)) end
  12.  
  13. fun newgenseed seed =
  14.     {seedref = ref (nextrand seed)};
  15.  
  16. fun newgen () =
  17.     let prim_val getrealtime_ : unit -> {sec : int, usec : int} 
  18.                                 = 1 "sml_getrealtime"
  19.         val {sec, usec} = getrealtime_ ()
  20.     in newgenseed (real sec + real usec) end
  21.  
  22. fun random {seedref as ref seed} = 
  23.     (seedref := nextrand seed; seed / m);
  24.  
  25. fun randomlist (n, {seedref as ref seed0}) = 
  26.     let fun h 0 seed res = (seedref := seed; res)
  27.       | h i seed res = h (i-1) (nextrand seed) (seed / m :: res)
  28.     in h n seed0 [] end;
  29.  
  30. fun range (min, max) = 
  31.     if min >= max then raise Fail "Random.range: empty range" 
  32.     else 
  33.     fn {seedref as ref seed} =>
  34.     (seedref := nextrand seed; min + (floor(real(max-min) * seed / m)));
  35.  
  36. fun rangelist (min, max) =
  37.     if min >= max then raise Fail "Random.rangelist: empty range" 
  38.     else 
  39.     fn (n, {seedref as ref seed0}) => 
  40.     let fun h 0 seed res = (seedref := seed; res)
  41.           | h i seed res = h (i-1) (nextrand seed) 
  42.                        (min + floor(real(max-min) * seed / m) :: res)
  43.     in h n seed0 [] end
  44.